////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Στο παρόν βρίσκουμε δομές και μεθόδους που αφορούν στο στήσιμο
// της παρτίδας και είναι κοινές στον server και στον client.
//
// Η συνήθης διαδικασία κατά το στήσιμο της παρτίδας έχει ως εξής:
//
// 1.	Ο παίκτης επιλέγει κάποια ενέργεια που αφορά στο στήσιμο
//	της παρτίδας από τον client. Αυτό γίνεται συνήθως μέσω
//	κάποιου πλήκτρου του control panel.
// 2.	Στον client δεν επιτελείται απολύτως καμία ενέργεια, παρά
//	μονάχα η αποστολή σχετικού αιτήματος στον Node server.
// 3.	Ο server παραλαμβάνει το σχετικό αίτημα και αφού κάνει
//	κάποιους ελέγχους ασφαλείας προχωρεί στην εφαρμογή του
//	αιτήματος στην database.
// 4.	Αν δεν γίνει επιτυχής εφαρμογή του αιτήματος στην database
//	δεν γίνεται καμιά περαιτέρω ενέργεια.
// 5.	Εφόσον έγινε επιτυχής εφαρμογή του αιτήματος στην database,
//	επιτελείται εφαρμογή του αιτήματος στο σκηνικό του server
//	και αποστέλλεται σχετική κίνηση σε όλους τους clients.
// 6.	Κατά την παραλαβή της σχετικής κίνησης από τους clients,
//	συμπεριλαμβανομένου και του client που έθεσε το αίτημα,
//	εκτελούνται παρόμοιες ενέργειες και εφαρμογή του αιτήματος
//	στο σκηνικό των επιμέρους clients.
//
// Όλα οι δομές και μέθοδοι που ακολουθούν εντάσσονται στο global
// αντικείμενο "Prefadoros.stisimo".
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.stisimo = {};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Ακολουθούν κάποιες functions-εργαλεία που χρησιμοποιούνται από όλα
// σχεδόν τα αιτήματα που αφορούν στο στήσιμο της παρτίδας.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "apodoxiReset" καλείται με παραμέτρους το τραπέζι και τη
// θέση του παίκτη που αιτείται την αλλαγή, και σκοπό έχει την άρση της
// αποδοχής από τους άλλους δύο παίκτες του τραπεζιού. Επιστρέφει ένα
// αντικείμενο που μοιάζει με το τραπέζι όσον αφορά στα properties των
// παικτών και των αντίστοιχων αποδοχών μετά την ανωτέρω άρση αποδοχών.
// Το αντικείμενο που επιστρέφεται το ονομάζουμε "tok" από τις λέξεις
// "trapezi" και "ok". Η μέθοδος καλείται συνήθως πριν από την εφαρμογή
// των αιτημάτων.

Prefadoros.stisimo.apodoxiReset = function(trapezi, thesi) {
	var tok = {}, i;

	for (i in Prefadoros.thesiValid) {
		tok['pektis' + i]  = trapezi['pektis' + i];
		tok['apodoxi' + i] = (i == thesi ? trapezi['apodoxi' + i] : false);
	}

	return tok;
}

// Η μέθοδος "apodoxiUpdate" είναι συνήθως το πρώτο βήμα στην εφαρμογή
// των αιτημάτων και σκοπό έχει την ενημέρωση των πεδίων παικτών και
// αποδοχών στο τραπέζι.

Prefadoros.stisimo.apodoxiUpdate = function(trapezi, tok) {
	var thesi, i;

	for (thesi in Prefadoros.thesiValid) {
		i = 'pektis' + thesi;
		if (tok.hasOwnProperty(i)) trapezi[i]  = tok[i];

		i = 'apodoxi' + thesi;
		if (tok.hasOwnProperty(i)) trapezi[i]  = tok[i];
	}
}

// Η μέθοδος "entopismos" είναι το τελευταίο βήμα στην εφαρμογή των αιτημάτων
// που προκαλούν αλλαγή στις θέσεις των παικτών. Σκοπός της μεθόδου είναι ο
// επαναπροσδιορισμός των στοιχείων θέσης στις συνεδρίες των ενεργών παικτών
// του τραπεζιού.

Prefadoros.stisimo.entopismos = function(trapezi) {
	var thesi, pektis, sinedria;

	for (thesi in Prefadoros.thesiValid) {
		pektis = trapezi.pektis(thesi);
		if (!pektis) continue;

		sinedria = Skiniko.isSinedria(pektis);
		if (!sinedria) continue;

		if (sinedria.trapezi != trapezi.kodikos) continue;
		sinedria.thesi = parseInt(thesi);
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "roloiPrep" είναι προκαταρκτική στην κυκλική εναλλαγή των παικτών
// του τραπεζιού. Δημιουργεί και επιστρέφει αντικείμενο με τους παίκτες στην
// αιτούμενη θέση και τις δέουσες αλλαγές στα στοιχεία αποδοχής.

Prefadoros.stisimo.roloiPrep = function(trapezi, sinedria) {
	var tok, p, a;

	tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);

	p = tok['pektis1'];
	a = tok['apodoxi1'];

	tok['pektis1'] = tok['pektis3'];
	tok['apodoxi1'] = tok['apodoxi3'];

	tok['pektis3'] = tok['pektis2'];
	tok['apodoxi3'] = tok['apodoxi2'];

	tok['pektis2'] = p;
	tok['apodoxi2'] = a;

	return tok;
}

// Η μέθοδος "roloi" εφαρμόζει την κυκλική εναλλαγή των παικτών στο τραπέζι.
// Ως δεύτερη παράμετρος δίνεται η θέση του παίκτη που κάνει την αλλαγή και
// ακολουθεί αντικείμενο με τους παίκτες στις αιτούμενες θέσεις και τα δέοντα
// στοιχεία αποδοχής. Αν το τραπέζι είναι ιδιόκτητο, αίρεται η ιδιοκτησία καθώς
// ο πρώτος παίκτης αλλάζει θέση και δεν θα μπορεί πλέον να ελέγχει το τραπέζι.

Prefadoros.stisimo.roloi = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	Prefadoros.stisimo.entopismos(trapezi);
	trapezi.trparamSet('ΙΔΙΟΚΤΗΤΟ', 'ΟΧΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "diataxiPrep" δέχεται ως παραμέτρους το τραπέζι και την θέση
// του παίκτη που αιτείται την αλλαγή διάταξης των άλλων δύο παικτών, και
// σκοπό έχει τη δημιουργία και την επιστροφή αντικειμένου παρόμοιου με το
// τραπέζι με τους παίκτες στην αιτούμενη θέση καθώς και τα δέοντα στοιχεία
// αποδοχής. Αν η μέθοδος διαπιστώσει ότι η αλλαγή δεν έχει νόημα, τότε
// επιστρέφει null. Αυτό μπορεί να συμβεί όταν οι θέσεις των παικτών που
// εναλλάσσονται είναι άδειες.

Prefadoros.stisimo.diataxiPrep = function(trapezi, sinedria) {
	var t1, t2, p1, p2, tok, p, a;

	switch (sinedria.thesi) {
	case 1:
		t1 = 2;
		t2 = 3;
		break;
	case 2:
		t1 = 1;
		t2 = 3;
		break;
	default:
		t1 = 1;
		t2 = 2;
		break;
	}

	p1 = trapezi['pektis' + t1];
	p2 = trapezi['pektis' + t2];
	if ((!p1) && (!p2)) return null;

	tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);

	p = tok['pektis' + t1];
	a = tok['apodoxi' + t1];

	tok['pektis' + t1] = tok['pektis' + t2];
	tok['apodoxi' + t1] = tok['apodoxi' + t2];

	tok['pektis' + t2] = p;
	tok['apodoxi' + t2] = a;

	return tok;
}

// Η μέθοδος "diataxi" δέχεται το τραπέζι και τη θέση του παίκτη που αιτείται
// αλλαγή διάταξης των άλλων δύο παικτών, καθώς επίσης και αντικείμενο που
// περιέχει τους παίκτες και τα στοιχεία αποδοχής μετά την αλλαγή. Σκοπός της
// μεθόδου είναι να εφαρμόσει τις αλλαγές στο τραπέζι.

Prefadoros.stisimo.diataxi = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	Prefadoros.stisimo.entopismos(trapezi);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "kasaPrep" δέχεται ως παραμέτρους το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή κάσας. Η μέθοδος δημιουργεί και επιστρέφει αντικείμενο
// παρόμοιο με το τραπέζι, με την αιτούμενη κάσα και τα δέοντα στοιχεία αποδοχής.
// Ως default θεωρείται η 50άρα κάσα.

Prefadoros.stisimo.kasaPrep = function(trapezi, sinedria) {
	var tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);
	tok.kasa = (trapezi.kasa() == 50 ? 30 : 50);
	return tok;
}
// Η μέθοδος "kasa" θέτει την κάσα του τραπεζιού καθώς και τα δέοντα στοιχεία
// αποδοχής όπως αυτά τα στοιχεία περιγράφονται στο αντικείμενο "tok" που έχει
// ήδη προετοιμαστεί.

Prefadoros.stisimo.kasa = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΚΑΣΑ', tok.kasa);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "pasoPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή του πάσο, πάσο, πάσο. Η μέθοδος δημιουργεί και
// επιστρέφει αντικείμενο παρόμοιο με το τραπέζι, με το αιτούμενο πάσο, πάσο,
// πάσο και τα δέοντα στοιχεία αποδοχής. Ως default θεωρείται ότι δεν παίζεται
// το πάσο, πάσο, πάσο.

Prefadoros.stisimo.pasoPrep = function(trapezi, sinedria) {
	var tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);
	tok.paso = trapezi.oxiPaso();
	return tok;
}

Prefadoros.stisimo.paso = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΠΑΣΟ', tok.paso ? 'ΝΑΙ' : 'ΟΧΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "asoiPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη που
// αιτείται την αλλαγή των άσων. Η μέθοδος δημιουργεί και επιστρέφει αντικείμενο
// παρόμοιο με το τραπέζι, με το αιτούμενο καθεστώς των άσων και τα δέοντα στοιχεία
// αποδοχής. Ως default θεωρείται ότι παίζονται οι άσοι.

Prefadoros.stisimo.asoiPrep = function(trapezi, sinedria) {
	var tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);
	tok.asoi = trapezi.oxiAsoi();
	return tok;
}

Prefadoros.stisimo.asoi = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΑΣΟΙ', tok.asoi ? 'ΝΑΙ' : 'ΟΧΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "filikiPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή φιλικότητας. Η μέθοδος δημιουργεί και επιστρέφει αντικείμενο
// παρόμοιο με το τραπέζι, με την αιτούμενη φιλικότητα και τα δέοντα στοιχεία αποδοχής.
// Ως default θεωρείται ότι παίζεται αγωνιστική παρτίδα.

Prefadoros.stisimo.filikiPrep = function(trapezi, sinedria) {
	var tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);
	tok.filiki = trapezi.isAgonistiki();
	return tok;
}

Prefadoros.stisimo.filiki = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΦΙΛΙΚΗ', tok.filiki ? 'ΝΑΙ' : 'ΟΧΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "postelPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή τρόπου πληρωμής τελευταίας διανομής. Η μέθοδος δημιουργεί
// και επιστρέφει αντικείμενο παρόμοιο με το τραπέζι, με τον αιτούμενο τρόπο πληρωμής
// και τα δέοντα στοιχεία αποδοχής. Ως default θεωρείται ο κανονικός τρόπος πληρωμής.
// Μαζί με την κυρίως property "postel" επιστρέφουμε και κάποια άλλα χρήσιμα στοιχεία.
// Πιο συγκεκριμένα, επιστρέφουμε την property "postel" που είναι η τιμή της σχετικής
// παραμέτρου στην database, μια περιγραφή και το αρχείο του σχετικού εικονιδίου.

Prefadoros.stisimo.postelPrep = function(trapezi, sinedria) {
	var tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);
	switch (trapezi.telioma()) {
	case 'N':
		tok.postel = 'ΑΝΙΣΟΡΡΟΠΟ';
		tok.desc = 'Ανισόρροπη';
		tok.img = 'anisoropo';
		break;
	case 'U':
		tok.postel = 'ΔΙΚΑΙΟ';
		tok.desc = 'Δίκαιη';
		tok.img = 'dikeo';
		break;
	default:
		tok.postel = 'ΚΑΝΟΝΙΚΟ';
		tok.desc = 'Κανονική';
		tok.img = 'kanoniko';
		break;
	}

	return tok;
}

Prefadoros.stisimo.postel = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΤΕΛΕΙΩΜΑ', tok.postel);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "idioktitoPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή ιδιοκτησίας του τραπεζιού. Η μέθοδος δημιουργεί και επιστρέφει
// αντικείμενο παρόμοιο με το τραπέζι, με τον αιτούμενο τρόπο πληρωμής και τα δέοντα
// στοιχεία αποδοχής. Ως default θεωρείται το ελεύθερο τραπέζι.

Prefadoros.stisimo.idioktitoPrep = function(trapezi, sinedria) {
	var tok = Prefadoros.stisimo.apodoxiReset(trapezi, sinedria.thesi);
	tok.idioktito = trapezi.isElefthero();
	return tok;
}

Prefadoros.stisimo.idioktito = function(trapezi, tok) {
	if (tok.idioktito) Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΙΔΙΟΚΤΗΤΟ', tok.idioktito ? 'ΝΑΙ' : 'ΟΧΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Prefadoros.stisimo.idiotikotitaPrep = function(trapezi) {
	var tok = {};
	tok.prive = trapezi.isDimosio();
	return tok;
}

Prefadoros.stisimo.idiotikotita = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΠΡΙΒΕ', tok.prive ? 'ΝΑΙ' : 'ΟΧΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "klistoPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή θέασης των φύλλων στους θεατές. Η μέθοδος δημιουργεί
// και επιστρέφει αντικείμενο παρόμοιο με το τραπέζι, με την αιτούμενη θέαση.
// Η αλλαγή αυτή δεν αίρει την αποδοχή από τους άλλους παίκτες. Ως default
// θεωρείται η εμφάνιση των φύλλων στους θεατές.

Prefadoros.stisimo.klistoPrep = function(trapezi) {
	var tok = {};
	tok.klisto = trapezi.isAnikto(trapezi);
	return tok;
}

Prefadoros.stisimo.klisto = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΑΝΟΙΚΤΟ', tok.klisto ? 'ΟΧΙ' : 'ΝΑΙ');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Η μέθοδος "epetiakiPrep" δέχεται ως παράμετρο το τραπέζι και τη θέση του παίκτη
// που αιτείται την αλλαγή της επετειακότητας του τραπεζιού. Η μέθοδος δημιουργεί
// και επιστρέφει αντικείμενο παρόμοιο με το τραπέζι, με την αιτούμενη επετειακότητα.
// Η αλλαγή αυτή δεν αίρει την αποδοχή από τους άλλους παίκτες. Ως default θεωρείται
// η μη επετειακή παρτίδα.

Prefadoros.stisimo.epetiakiPrep = function(trapezi) {
	var tok = {};
	tok.epetiaki = trapezi.oxiEpetiaki();
	return tok;
}

Prefadoros.stisimo.epetiaki = function(trapezi, tok) {
	Prefadoros.stisimo.apodoxiUpdate(trapezi, tok);
	trapezi.trparamSet('ΕΠΕΤΕΙΑΚΗ', tok.epetiaki ? 'ΝΑΙ' : 'ΟΧΙ');
}

// Η μέθοδος "apodoxi" δέχεται ένα τραπέζι και τη συνεδρία τού
// παίκτη που αιτείται αλλαγή καθεστώτος αποδοχής.

Prefadoros.stisimo.apodoxi = function(trapezi, sinedria) {
	trapezi['apodoxi' + sinedria.thesi] = !trapezi['apodoxi' + sinedria.thesi];
}
